home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume7 / 2.11news / part16 < prev    next >
Encoding:
Internet Message Format  |  1986-11-30  |  60.6 KB

  1. Subject:  v07i055:  2.11 News Source, Part06/09
  2. Newsgroups: mod.sources
  3. Approved: mirror!rs
  4.  
  5. Submitted by: seismo!rick (Rick Adams)
  6. Mod.sources: Volume 7, Issue 55
  7. Archive-name: 2.11news/Part06
  8.  
  9. # To extract, sh this file
  10. #    news 2.11 source part 6 of 9
  11. if test ! -d src
  12. then
  13.     mkdir src
  14. fi
  15. echo x - src/header.c 1>&2
  16. sed 's/.//' >src/header.c <<'*-*-END-of-src/header.c-*-*'
  17. -/*
  18. - * This software is Copyright (c) 1986 by Rick Adams.
  19. - *
  20. - * Permission is hereby granted to copy, reproduce, redistribute or
  21. - * otherwise use this software as long as: there is no monetary
  22. - * profit gained specifically from the use or reproduction or this
  23. - * software, it is not sold, rented, traded or otherwise marketed, and
  24. - * this copyright notice is included prominently in any copy
  25. - * made.
  26. - *
  27. - * The author make no claims as to the fitness or correctness of
  28. - * this software for any use whatsoever, and it is provided as is. 
  29. - * Any use of this software is at the user's own risk.
  30. - *
  31. - * header.c - header functions plus some other goodies
  32. - */
  33. -
  34. -#ifdef SCCSID
  35. -static char    *SccsId = "@(#)header.c    2.43    10/23/86";
  36. -#endif /* SCCSID */
  37. -
  38. -#include <stdio.h>
  39. -#include "params.h"
  40. -
  41. -char *hfgets();
  42. -
  43. -char *news_version = NEWS_VERSION;
  44. -
  45. -/*
  46. - * Read header from file fp into *hp.  If wholething is FALSE,
  47. - * it's an incremental read, otherwise start from scratch.
  48. - * Return (FILE *) if header okay, else NULL.
  49. - */
  50. -FILE *
  51. -hread(hp, fp, wholething)
  52. -register struct hbuf *hp;
  53. -FILE *fp;
  54. -int wholething;
  55. -{
  56. -    register int    len;
  57. -    register int    i;
  58. -#ifdef OLD
  59. -    char *p;
  60. -#endif /* OLD */
  61. -
  62. -    if (wholething) {
  63. -        for(i=0;i<NUNREC;i++)
  64. -            if (hp->unrec[i] != NULL)
  65. -                free(hp->unrec[i]);
  66. -            else
  67. -                break;
  68. -        bzero((char *)hp, sizeof (*hp));
  69. -        for (i=0;i<NUNREC;i++)
  70. -            hp->unrec[i] = NULL;
  71. -    }
  72. -
  73. -    /* Check that it's a B news style header. */
  74. -    if (hfgets(bfr, PATHLEN, fp) != NULL && isalpha(bfr[0])
  75. -        && index(bfr, ':'))
  76. -        if (frmread(fp, hp))
  77. -            goto strip;
  78. -
  79. -    if (!nstrip(bfr+1))
  80. -        return NULL;
  81. -
  82. -    /* It's not.  Try A news (begins with PROTO). */
  83. -    if (bfr[0] != PROTO)
  84. -        return NULL;
  85. -#ifndef OLD
  86. -    logerr("Can not process A news format article without OLD defined");
  87. -#else /* OLD */
  88. -    /* Read in an A news format article. */
  89. -    p = index(bfr+1, '.');
  90. -    if (p == NULL) {
  91. -        (void) strcpy(hp->ident, bfr+1);
  92. -        return NULL;
  93. -    }
  94. -    *p++ = '\0';
  95. -    (void) sprintf(hp->ident, "<%s@%s%s>", p, bfr+1, ".UUCP");
  96. -
  97. -    /* Newsgroup List */
  98. -    if (hfgets(hp->nbuf, BUFLEN, fp) == NULL || !nstrip(hp->nbuf))
  99. -        return NULL;
  100. -    /* source path */
  101. -    if (hfgets(hp->path, PATHLEN, fp) == NULL || !nstrip(hp->path))
  102. -        return NULL;
  103. -    /* date */
  104. -    if (hfgets(hp->subdate, DATELEN, fp) == NULL || !nstrip(hp->subdate))
  105. -        return NULL;
  106. -    /* title */
  107. -    if (hfgets(hp->title, BUFLEN, fp) == NULL || !nstrip(hp->title))
  108. -        return NULL;
  109. -#endif /* OLD */
  110. -
  111. -strip:    /* strip off sys! from front of path. */
  112. -    if (strncmp(FULLSYSNAME, hp->path, (len = strlen(FULLSYSNAME))) == 0
  113. -        && index(NETCHRS, hp->path[len]))
  114. -        (void) strcpy(hp->path, &(hp->path[len+1]));
  115. -    lcase(hp->nbuf);
  116. -
  117. -    /* Intuit the From: line if only a path was given. */
  118. -    if (wholething) {
  119. -#ifdef OLD
  120. -        if (hp->from[0] == '\0')
  121. -            intuitfrom(hp);
  122. -        else
  123. -#endif /* OLD */
  124. -            fixfrom(hp);
  125. -    }
  126. -
  127. -    return fp;
  128. -}
  129. -
  130. -
  131. -/*
  132. - * Get header info from mail-format file.
  133. - * Return non-zero on success.
  134. - */
  135. -#define FROM         1
  136. -#define NEWSGROUP     2
  137. -#define TITLE         3
  138. -#define SUBMIT        4
  139. -#define RECEIVE        5
  140. -#define EXPIRE        6
  141. -#define ARTICLEID    7
  142. -#define MESSAGEID    8
  143. -#define REPLYTO        9
  144. -#define FOLLOWID    10
  145. -#define CONTROL        11
  146. -#define SENDER        12
  147. -#define FOLLOWTO    13
  148. -#define PATH        14
  149. -#define POSTVERSION    15
  150. -#define RELAYVERSION    16
  151. -#define DISTRIBUTION    17
  152. -#define ORGANIZATION    18
  153. -#define NUMLINES    19
  154. -#define KEYWORDS    20
  155. -#define APPROVED    21
  156. -#define NFID        22
  157. -#define NFFROM        23
  158. -#define XREF        24
  159. -#define SUMMARY        25
  160. -#define XPATH        26
  161. -#define OTHER        99
  162. -
  163. -char *malloc();
  164. -
  165. -frmread(fp, hp)
  166. -register FILE *fp;
  167. -register struct hbuf *hp;
  168. -{
  169. -    int    unreccnt = 0;
  170. -    register int    i;
  171. -    long    curpos;
  172. -
  173. -    i = type(bfr);
  174. -    do {
  175. -        curpos = ftell(fp);
  176. -        switch (i) {
  177. -        case PATH:
  178. -            getfield(hp->path, sizeof(hp->path));
  179. -            break;
  180. -        case FROM:
  181. -            getfield(hp->from, sizeof(hp->from));
  182. -            break;
  183. -        case NEWSGROUP:
  184. -            getfield(hp->nbuf, sizeof(hp->nbuf));
  185. -            break;
  186. -        case TITLE:
  187. -            getfield(hp->title, sizeof(hp->title));
  188. -            break;
  189. -        case SUBMIT:
  190. -            getfield(hp->subdate, sizeof(hp->subdate));
  191. -            break;
  192. -        case EXPIRE:
  193. -            getfield(hp->expdate, sizeof(hp->expdate));
  194. -            break;
  195. -#ifdef OLD
  196. -        case ARTICLEID:
  197. -            /* Believe Message-ID in preference to Article-ID */
  198. -            if (hp->ident[0] == '\0') {
  199. -                register char *p;
  200. -                char msgb[NAMELEN];
  201. -                getfield(msgb, sizeof msgb);
  202. -                p = index(msgb, '.');
  203. -                if (p == NULL) {
  204. -                    (void) strcpy(hp->ident, msgb);
  205. -                } else {
  206. -                    *p++ = '\0';
  207. -                    (void) sprintf(hp->ident, "<%s@%s%s>", p, msgb, ".UUCP");
  208. -                }
  209. -            }
  210. -            break;
  211. -#endif /* OLD */
  212. -        case MESSAGEID:
  213. -            getfield(hp->ident, sizeof(hp->ident));
  214. -            break;
  215. -        case REPLYTO:
  216. -            getfield(hp->replyto, sizeof(hp->replyto));
  217. -            break;
  218. -        case FOLLOWID:
  219. -            getfield(hp->followid, sizeof(hp->followid));
  220. -            break;
  221. -        case SENDER:
  222. -            getfield(hp->sender, sizeof(hp->sender));
  223. -            break;
  224. -        case FOLLOWTO:
  225. -            getfield(hp->followto, sizeof(hp->followto));
  226. -            break;
  227. -        case CONTROL:
  228. -            getfield(hp->ctlmsg, sizeof(hp->ctlmsg));
  229. -            break;
  230. -        case DISTRIBUTION:
  231. -            getfield(hp->distribution, sizeof(hp->distribution));
  232. -            break;
  233. -        case ORGANIZATION:
  234. -            getfield(hp->organization, sizeof(hp->organization));
  235. -            break;
  236. -        case NUMLINES:
  237. -            getfield(hp->numlines, sizeof(hp->numlines));
  238. -            hp->intnumlines = atoi(hp->numlines);
  239. -            break;
  240. -        case KEYWORDS:
  241. -            getfield(hp->keywords, sizeof(hp->keywords));
  242. -            break;
  243. -        case APPROVED:
  244. -            getfield(hp->approved, sizeof(hp->approved));
  245. -            break;
  246. -        case NFID:
  247. -            getfield(hp->nf_id, sizeof(hp->nf_id));
  248. -            break;
  249. -        case NFFROM:
  250. -            getfield(hp->nf_from, sizeof(hp->nf_from));
  251. -            break;
  252. -        /* discard these lines */
  253. -        case XREF:
  254. -        case XPATH:
  255. -        case RELAYVERSION:
  256. -        case POSTVERSION:
  257. -        case RECEIVE:
  258. -            break;
  259. -        case SUMMARY:
  260. -            getfield(hp->summary, sizeof(hp->summary));
  261. -            break;
  262. -        case OTHER:
  263. -            if (unreccnt < NUNREC) {
  264. -                if ((hp->unrec[unreccnt] = malloc((unsigned)(strlen(bfr) + 1))) != NULL ) {
  265. -                    (void) strcpy(hp->unrec[unreccnt], bfr);
  266. -                    (void) nstrip(hp->unrec[unreccnt]);
  267. -                    unreccnt++;
  268. -                } else
  269. -                    xerror("frmread: out of memory");
  270. -            }
  271. -            break;
  272. -        }
  273. -    } while ((i = type(hfgets(bfr, LBUFLEN, fp))) > 0);
  274. -
  275. -    if (*bfr != '\n')
  276. -        fseek(fp, curpos, 0);
  277. -    if ((hp->from[0] || hp->path[0]) && hp->subdate[0] && hp->ident[0])
  278. -        return TRUE;
  279. -    return FALSE;
  280. -}
  281. -
  282. -#ifdef OLD
  283. -/*
  284. - * There was no From: line in the message (because it was generated by
  285. - * an old news program).  Guess what it should have been and create it.
  286. - */
  287. -intuitfrom(hp)
  288. -register struct hbuf *hp;
  289. -{
  290. -    char *tp;
  291. -    char *user, *host;
  292. -    char *tailpath(), *rindex();
  293. -    char *at, *dot;
  294. -    char pathbuf[PATHLEN];
  295. -    char fullname[BUFLEN];
  296. -
  297. -    tp = tailpath(hp);
  298. -    user = rindex(tp, '!');
  299. -    if (user == NULL)
  300. -        user = tp;
  301. -    else
  302. -        *user++ = '\0';
  303. -
  304. -    /* Check for an existing Internet address on the end. */
  305. -    at = index(user, '@');
  306. -    if (at) {
  307. -        dot = index(at, '.');
  308. -        if (dot) {
  309. -            (void) strcpy(hp->from, user);
  310. -            return;
  311. -        }
  312. -        /* @ signs are illegal except for the biggie, so */
  313. -        *at = '%';
  314. -    }
  315. -
  316. -    if (tp[0] == '.')
  317. -        host = index(tp, '!') + 1;
  318. -    else if (user == tp)
  319. -        host = FULLSYSNAME;
  320. -    else
  321. -        host = tp;
  322. -
  323. -    tp = index(host, '@');
  324. -    if (tp != NULL)
  325. -        *tp = 0;
  326. -    (void) sprintf(hp->from, "%s@%s%s", user, host, MYDOMAIN);
  327. -
  328. -    skin(pathbuf, fullname, hp->path);    /* remove RFC822-style comments */
  329. -    if (fullname[0] != '\0') {
  330. -        strcat(hp->from, " (");
  331. -        (void) strcat(hp->from, fullname);
  332. -        strcat(hp->from, ")");
  333. -    }
  334. -    strcpy(hp->path, pathbuf);    /* and stick it back in */
  335. -}
  336. -#endif /* OLD */
  337. -
  338. -/*
  339. - * Canonicalize the "From:" line into the form
  340. - *
  341. - * From: <mail-address> (full-name)
  342. - *
  343. - * RFC822 doesn't require the comment to be at the end of the string
  344. - * like that.
  345. - */
  346. -fixfrom(hp)
  347. -register struct hbuf *hp;
  348. -{
  349. -    char frombuf[PATHLEN];
  350. -    char fullname[BUFLEN];
  351. -
  352. -    skin(frombuf, fullname, hp->from);    /* remove RFC822-style comments */
  353. -    if (fullname[0] != '\0') {
  354. -        strcat(frombuf, " (");
  355. -        strcat(frombuf, fullname);
  356. -        strcat(frombuf, ")");
  357. -    }
  358. -    strcpy(hp->from, frombuf);    /* stick the canonicalized "from" back in */
  359. -}
  360. -
  361. -skin(name, fullname, hfield)
  362. -char *name;
  363. -char *fullname;
  364. -char *hfield;
  365. -{
  366. -    register int c;
  367. -    register char *cp, *cp2;
  368. -    char *bufend;
  369. -    int gotlt, parenlev, lastsp;
  370. -    int seenfullname = FALSE;
  371. -
  372. -    *fullname = '\0';    /* no full name yet */
  373. -    if (strpbrk(hfield, "(< ") == NULL) {        /* include ',' ?? */
  374. -        strcpy(name, hfield);
  375. -        return;
  376. -    }
  377. -    gotlt = 0;
  378. -    parenlev = 0;
  379. -    lastsp = 0;
  380. -    bufend = name;
  381. -    for (cp = hfield, cp2 = bufend; c = *cp++; ) {
  382. -        switch (c) {
  383. -        case '(':
  384. -            /*
  385. -             * Start of a "comment".
  386. -             * Ignore it, or save it in "fullname" if we haven't
  387. -             * seen a comment yet.
  388. -             */
  389. -            parenlev++;
  390. -            while ((c = *cp) != 0) {
  391. -                cp++;
  392. -                switch (c) {
  393. -                case '\\':
  394. -                    if ((c = *cp) == 0)
  395. -                        goto outcm;
  396. -                    cp++;
  397. -                    break;
  398. -                case '(':
  399. -                    parenlev++;
  400. -                    break;
  401. -                case ')':
  402. -                    parenlev--;
  403. -                    if (parenlev == 0)
  404. -                        goto outcm;
  405. -                    break;
  406. -                }
  407. -                if (!seenfullname)
  408. -                    *fullname++ = c;
  409. -            }
  410. -        outcm:
  411. -            parenlev = 0;
  412. -            lastsp = 0;
  413. -            if (!seenfullname) {
  414. -                *fullname = '\0';
  415. -                seenfullname = TRUE;    /* only extract first comment */
  416. -            }
  417. -            break;
  418. -
  419. -        case '"':
  420. -            /*
  421. -             * Start of a "quoted-string".
  422. -             * Copy it in its entirety.
  423. -             */
  424. -            while ((c = *cp) != 0) {
  425. -                cp++;
  426. -                switch (c) {
  427. -                case '\\':
  428. -                    if ((c = *cp) == 0)
  429. -                        goto outqs;
  430. -                    cp++;
  431. -                    break;
  432. -                case '"':
  433. -                    goto outqs;
  434. -                }
  435. -                *cp2++ = c;
  436. -            }
  437. -        outqs:
  438. -            lastsp = 0;
  439. -            break;
  440. -
  441. -        case ' ':
  442. -            if (cp[0] == 'a' && cp[1] == 't' && cp[2] == ' ')
  443. -                cp += 3, *cp2++ = '@';
  444. -            else
  445. -            if (cp[0] == '@' && cp[1] == ' ')
  446. -                cp += 2, *cp2++ = '@';
  447. -            else
  448. -                lastsp = 1;
  449. -            break;
  450. -
  451. -        case '<':
  452. -            if (!seenfullname) {
  453. -                *cp2 = '\0';
  454. -                strcpy(fullname, name);
  455. -                seenfullname = TRUE;
  456. -            }
  457. -            cp2 = bufend;
  458. -            gotlt++;
  459. -            lastsp = 0;
  460. -            break;
  461. -
  462. -        case '>':
  463. -            if (gotlt) {
  464. -                gotlt = 0;
  465. -                /*
  466. -                 * this doesn't seem reasonable, what about (,)
  467. -                 * or "," ??
  468. -                 */
  469. -                while (*cp != ',' && *cp != 0)
  470. -                    cp++;
  471. -                if (*cp == 0 )
  472. -                    goto done;
  473. -                *cp2++ = ',';
  474. -                *cp2++ = ' ';
  475. -                bufend = cp2;
  476. -                break;
  477. -            }
  478. -
  479. -            /* Fall into . . . */
  480. -
  481. -        default:
  482. -            if (lastsp) {
  483. -                lastsp = 0;
  484. -                *cp2++ = ' ';
  485. -            }
  486. -            *cp2++ = c;
  487. -            break;
  488. -        }
  489. -    }
  490. -done:
  491. -    *cp2 = 0;
  492. -}
  493. -
  494. -
  495. -#ifdef OLD
  496. -char *
  497. -oident(ident)
  498. -char *ident;
  499. -{
  500. -    char lbuf[BUFLEN];
  501. -    static char oidbuf[BUFLEN];
  502. -    register char *p, *q;
  503. -
  504. -    (void) strcpy(lbuf, ident);
  505. -    p = index(lbuf, '@');
  506. -    if (p == NULL)
  507. -        return ident;
  508. -    *p++ = '\0';
  509. -    q = index(p, '.');
  510. -    if (q == NULL)
  511. -        q = index(p, '>');
  512. -    if (q)
  513. -        *q++ = '\0';
  514. -    p[SNLN] = '\0';
  515. -    (void) sprintf(oidbuf, "%s.%s", p, lbuf+1);
  516. -    return oidbuf;
  517. -}
  518. -#endif /* OLD */
  519. -
  520. -/*
  521. - * Get the given field of a header (char * parm) from bfr, but only
  522. - * if there's something actually there (after the colon).  Don't
  523. - * bother if we already have an entry for this field.
  524. - */
  525. -getfield(hpfield, size)
  526. -char    *hpfield;
  527. -int    size;
  528. -{
  529. -    register char    *ptr;
  530. -
  531. -    if (hpfield[0])
  532. -        return;
  533. -    for (ptr = index(bfr, ':'); isspace(*++ptr); )
  534. -        ;
  535. -    if (*ptr != '\0') {
  536. -        (void) strncpy(hpfield, ptr, size - 1);
  537. -        (void) nstrip(hpfield);
  538. -    }
  539. -}
  540. -
  541. -
  542. -#define its(type) (prefix(ptr, type))
  543. -type(ptr)
  544. -register char    *ptr;
  545. -{
  546. -    register char    *colon, *space;
  547. -
  548. -    if (ptr == NULL)
  549. -        return FALSE;
  550. -    if (its("From: "))
  551. -        if (index(ptr, '@') || !index(ptr, '!'))
  552. -            return FROM;
  553. -        else
  554. -            return PATH;
  555. -    if (its("Path: "))
  556. -        return PATH;
  557. -    if (its("Newsgroups: "))
  558. -        return NEWSGROUP;
  559. -    if (its("Subject: "))
  560. -        return TITLE;
  561. -    if (its("Date: "))
  562. -        return SUBMIT;
  563. -    if (its("Date-Received: "))
  564. -        return RECEIVE;
  565. -#ifdef OLD
  566. -    if (its("Title: "))
  567. -        return TITLE;
  568. -    if (its("Posted: "))
  569. -        return SUBMIT;
  570. -    if (its("Received: "))
  571. -        return RECEIVE;
  572. -#endif /* OLD */
  573. -    if (its("Expires: "))
  574. -        return EXPIRE;
  575. -    if (its("Article-I.D.: "))
  576. -        return ARTICLEID;
  577. -    if (its("Message-ID: "))
  578. -        return MESSAGEID;
  579. -    if (its("Reply-To: "))
  580. -        return REPLYTO;
  581. -    if (its("References: "))
  582. -        return FOLLOWID;
  583. -    if (its("Control: "))
  584. -        return CONTROL;
  585. -    if (its("Sender: "))
  586. -        return SENDER;
  587. -    if (its("Followup-To: "))
  588. -        return FOLLOWTO;
  589. -    if (its("Posting-Version: "))
  590. -        return POSTVERSION;
  591. -    if (its("Relay-Version: "))
  592. -        return RELAYVERSION;
  593. -    if (its("Distribution: "))
  594. -        return DISTRIBUTION;
  595. -    if (its("Organization: "))
  596. -        return ORGANIZATION;
  597. -    if (its("Lines: "))
  598. -        return NUMLINES;
  599. -    if (its("Summary: "))
  600. -        return SUMMARY;
  601. -    if (its("Keywords: "))
  602. -        return KEYWORDS;
  603. -    if (its("Approved: "))
  604. -        return APPROVED;
  605. -    if (its("Nf-ID: "))
  606. -        return NFID;
  607. -    if (its("Nf-From: "))
  608. -        return NFFROM;
  609. -    if (its("Xref: "))
  610. -        return XREF;
  611. -    if (its("Xpath: "))
  612. -        return XPATH;
  613. -    if (!isalpha(*ptr))
  614. -        return FALSE;
  615. -    colon = index(ptr, ':');
  616. -    space = index(ptr, ' ');
  617. -    if (!colon || space && space < colon)
  618. -        return FALSE;
  619. -    return OTHER;
  620. -}
  621. -
  622. -/*
  623. - * Write header at 'hp' on stream 'fp' in B+ format.  Include received date
  624. - * if wr is 1.  Leave off sysname if wr is 2.
  625. - */
  626. -ihwrite(hp, fp, wr)
  627. -register struct hbuf *hp;
  628. -register FILE *fp;
  629. -int    wr;
  630. -{
  631. -    int iu;
  632. -    time_t t;
  633. -    time_t cgtdate();
  634. -
  635. -    /*
  636. -     * We're being tricky with Path/From because of upward compatibility
  637. -     * issues.  The new version considers From and Path to be separate.
  638. -     * The old one thinks they both mean "Path" but only believes the
  639. -     * first one it sees, so will ignore the second.
  640. -     */
  641. -    if (prefix(hp->path, FULLSYSNAME) &&
  642. -        index(NETCHRS, hp->path[strlen(FULLSYSNAME)]))
  643. -        fprintf(fp, "Path: %s\n", hp->path);
  644. -    else
  645. -        fprintf(fp, "Path: %s!%s\n", FULLSYSNAME, hp->path);
  646. -    if (hp->from[0])
  647. -        fprintf(fp, "From: %s\n", hp->from);
  648. -
  649. -    fprintf(fp, "Newsgroups: %s\n", hp->nbuf);
  650. -    fprintf(fp, "Subject: %s\n", hp->title);
  651. -    if (*hp->summary)
  652. -        fprintf(fp, "Summary: %s\n", hp->summary);
  653. -    if (*hp->keywords)
  654. -        fprintf(fp, "Keywords: %s\n", hp->keywords);
  655. -    fprintf(fp, "Message-ID: %s\n", hp->ident);
  656. -    t = cgtdate(hp->subdate);
  657. -    fprintf(fp, "Date: %s\n", arpadate(&t));
  658. -#ifdef OLD
  659. -    fprintf(fp, "Article-I.D.: %s\n", oident(hp->ident));
  660. -    fprintf(fp, "Posted: %s", ctime(&t));
  661. -#endif /* OLD */
  662. -    if (*hp->expdate)
  663. -        fprintf(fp, "Expires: %s\n", hp->expdate);
  664. -    if (*hp->followid) {
  665. -        register char *dp, *cp;
  666. -
  667. -        dp = cp = hp->followid;
  668. -        while (*cp != '\0')
  669. -            if (*cp == '<' && *(cp + 1) == '>')
  670. -                cp += 2;
  671. -            else
  672. -                *dp++ = *cp++;
  673. -        *dp = '\0';
  674. -        if (*hp->followid)
  675. -            fprintf(fp, "References: %s\n", hp->followid);
  676. -    }
  677. -    if (*hp->ctlmsg)
  678. -        fprintf(fp, "Control: %s\n", hp->ctlmsg);
  679. -    if (*hp->sender)
  680. -        fprintf(fp, "Sender: %s\n", hp->sender);
  681. -    if (*hp->replyto)
  682. -        fprintf(fp, "Reply-To: %s\n", hp->replyto);
  683. -    if (*hp->followto)
  684. -        fprintf(fp, "Followup-To: %s\n", hp->followto);
  685. -    if (*hp->distribution)
  686. -        fprintf(fp, "Distribution: %s\n", hp->distribution);
  687. -    if (*hp->organization)
  688. -        fprintf(fp, "Organization: %s\n", hp->organization);
  689. -    if (*hp->numlines)
  690. -        fprintf(fp, "Lines: %s\n", hp->numlines);
  691. -    if (*hp->approved)
  692. -        fprintf(fp, "Approved: %s\n", hp->approved);
  693. -    if (*hp->nf_id)
  694. -        fprintf(fp, "Nf-ID: %s\n", hp->nf_id);
  695. -    if (*hp->nf_from)
  696. -        fprintf(fp, "Nf-From: %s\n", hp->nf_from);
  697. -#ifdef DOXREFS
  698. -    if ( wr ==1 && *hp->xref)
  699. -        fprintf(fp, "Xref: %s\n", hp->xref);
  700. -#endif /* DOXREFS */
  701. -    for (iu = 0; iu < NUNREC; iu++) {
  702. -        if (hp->unrec[iu])
  703. -            fprintf(fp, "%s\n", &hp->unrec[iu][0]);
  704. -    }
  705. -    putc('\n', fp);
  706. -}
  707. -
  708. -
  709. -#ifndef BSD4_2
  710. -/*
  711. - * Set nc bytes, starting at cp, to zero.
  712. - */
  713. -bzero(cp, nc)
  714. -register char    *cp;
  715. -register int    nc;
  716. -{
  717. -    if (nc > 0)
  718. -        do {
  719. -            *cp++ = 0;
  720. -        } while (--nc);
  721. -}
  722. -#endif /* !BSD4_2 */
  723. -
  724. -/*
  725. - * hfgets is like fgets, but deals with continuation lines.
  726. - * It also ensures that even if a line that is too long is
  727. - * received, the remainder of the line is thrown away
  728. - * instead of treated like a second line.
  729. - */
  730. -char *
  731. -hfgets(buf, len, fp)
  732. -char *buf;
  733. -int len;
  734. -FILE *fp;
  735. -{
  736. -    register int c;
  737. -    register int n = 0;
  738. -    register char *cp;
  739. -
  740. -    cp = buf;
  741. -    while (n < len && (c = getc(fp)) != EOF) {
  742. -        if (c == '\n')
  743. -            break;
  744. -        if (isprint(c) || c == '\b' || c == ' ' || c == '\t') {
  745. -            *cp++ = c;
  746. -            n++;
  747. -        }
  748. -    }
  749. -    if (c == EOF && cp == buf)
  750. -        return NULL;
  751. -    *cp = '\0';
  752. -
  753. -    if (c != '\n') {
  754. -        /* Line too long - part read didn't fit into a newline */
  755. -        while ((c = getc(fp)) != '\n' && c != EOF)
  756. -            ;
  757. -    } else if (cp == buf) {
  758. -        /* Don't look for continuation of blank lines */
  759. -        *cp++ = '\n';
  760. -        *cp = '\0';
  761. -        return buf;
  762. -    }
  763. -
  764. -    while ((c = getc(fp)) == ' ' || c == '\t') {    /* for each cont line */
  765. -        /* Continuation line. */
  766. -        if ((n += 2) < len) {
  767. -            *cp++ = '\n';
  768. -            *cp++ = c;
  769. -        }
  770. -        while ((c = getc(fp)) != '\n' && c != EOF)
  771. -            if ((isprint(c) || c == '\b' || c == ' ' || c == '\t')
  772. -                && n++ < len)
  773. -                *cp++ = c;
  774. -    }
  775. -    if (n >= len - 1)
  776. -        cp = buf + len - 2;
  777. -    *cp++ = '\n';
  778. -    *cp = '\0';
  779. -    if (c != EOF)
  780. -        (void) ungetc(c, fp); /* push back first char of next header */
  781. -    return buf;
  782. -}
  783. *-*-END-of-src/header.c-*-*
  784. echo x - src/rfuncs.c 1>&2
  785. sed 's/.//' >src/rfuncs.c <<'*-*-END-of-src/rfuncs.c-*-*'
  786. -/*
  787. - * This software is Copyright (c) 1986 by Rick Adams.
  788. - *
  789. - * Permission is hereby granted to copy, reproduce, redistribute or
  790. - * otherwise use this software as long as: there is no monetary
  791. - * profit gained specifically from the use or reproduction or this
  792. - * software, it is not sold, rented, traded or otherwise marketed, and
  793. - * this copyright notice is included prominently in any copy
  794. - * made.
  795. - *
  796. - * The author make no claims as to the fitness or correctness of
  797. - * this software for any use whatsoever, and it is provided as is. 
  798. - * Any use of this software is at the user's own risk.
  799. - *
  800. - * rfuncs - functions for readnews.
  801. - */
  802. -
  803. -#ifdef SCCSID
  804. -static char    *SccsId = "@(#)rfuncs.c    2.31    10/23/86";
  805. -#endif /* SCCSID */
  806. -
  807. -/*LINTLIBRARY*/
  808. -
  809. -#include "rparams.h"
  810. -
  811. -char lentab[LINES];    /* length of newsgroupname for each rcline */
  812. -long nngsize;        /* The next upcoming value of ngsize. */
  813. -long nminartno;        /* Smallest article number in this group */
  814. -int BITMAPSIZE = 0;
  815. -
  816. -nextng()
  817. -{
  818. -    long    curpos;
  819. -#ifdef DEBUG
  820. -    fprintf(stderr, "nextng()\n");
  821. -#endif
  822. -    curpos = ftell(actfp);
  823. -
  824. -next:
  825. -#ifdef DEBUG
  826. -    fprintf(stderr, "next:\n");
  827. -#endif
  828. -    if (actdirect == BACKWARD) {
  829. -        if (back()) {
  830. -            (void) fseek(actfp, curpos, 0);
  831. -            return 1;
  832. -        }
  833. -        if (back()) {
  834. -            (void) fseek(actfp, curpos, 0);
  835. -            return 1;
  836. -        }
  837. -    }
  838. -    if (fgets(afline, BUFLEN, actfp) == NULL)
  839. -        return 1;
  840. -    if (sscanf(afline, "%s %ld %ld", bfr, &nngsize, &nminartno) < 3) {
  841. -        bfr[0] = '\0';
  842. -        nngsize = 0;
  843. -        nminartno = 0;
  844. -    }
  845. -#ifdef DEBUG
  846. -    fprintf(stderr, "bfr = '%s'\n", bfr);
  847. -#endif
  848. -
  849. -    if (!ngmatch(bfr, header.nbuf))
  850. -        goto next;
  851. -    if (xflag)
  852. -        readmode = SPEC;
  853. -    else
  854. -        readmode = NEXT;
  855. -    if (selectng(bfr, TRUE, FALSE))
  856. -        goto next;
  857. -    return 0;
  858. -}
  859. -
  860. -
  861. -selectng(name, fastcheck, resubscribe)
  862. -char    *name;
  863. -{
  864. -    register char    *ptr, punct = ',';
  865. -    register int    i;
  866. -    register char    *p;
  867. -    register long    cur;
  868. -    long    next = 0;
  869. -    FILE *af;
  870. -    long s, sm;
  871. -    char buf[100], n[100];
  872. -
  873. -#ifdef DEBUG
  874. -    fprintf(stderr,"selectng: groupdir = %s\n", groupdir);
  875. -#endif /* DEBUG */
  876. -    if (*groupdir)
  877. -        updaterc();
  878. -    last = 1;
  879. -    if (strcmp(name, bfr)) {
  880. -        af = xfopen(ACTIVE, "r");
  881. -        while (fgets(buf, sizeof buf, af) != NULL) {
  882. -            if (sscanf(buf, "%s %ld %ld", n, &s, &sm) == 3 &&
  883. -                 strcmp(n, name) == 0) {
  884. -                ngsize = s;
  885. -                minartno = sm;
  886. -                break;
  887. -            }
  888. -        }
  889. -        (void) fclose(af);
  890. -    } else {
  891. -        ngsize = nngsize;
  892. -        minartno = nminartno;
  893. -    }
  894. -#ifdef DEBUG
  895. -    fprintf(stderr, "selectng(%s) sets ngsize to %ld, minartno to %ld\n",
  896. -        name, ngsize, minartno);
  897. -#endif
  898. -    (void) strcpy(groupdir, name);
  899. -    if (!xflag) {
  900. -        i = findrcline(name);
  901. -        if (i >= 0) {
  902. -            if (p = index(rcline[i], '!')) {
  903. -                switch (resubscribe) {
  904. -                case FALSE:
  905. -                    groupdir[0] = 0;
  906. -                    return 1;
  907. -                case TRUE:
  908. -                    *p = ':';
  909. -                    break;
  910. -                case PERHAPS:
  911. -                    zapng = TRUE;
  912. -                    break;
  913. -                }
  914. -            } else
  915. -                p = index(rcline[i], ':');
  916. -            if (!p) /* shouldn't happen */
  917. -                p = rcline[i];
  918. -            while (*++p == ' ')
  919. -                ;
  920. -            (void) sprintf(rcbuf, "%s%s%ld", rcline[i],
  921. -                *p == '\0' ? " " : ",", ngsize+1);
  922. -        }
  923. -        else
  924. -            (void) sprintf(rcbuf, "ng: %ld", ngsize+1);
  925. -    } else
  926. -        (void) sprintf(rcbuf, "ng: %ld", ngsize+1);
  927. -#ifdef DEBUG
  928. -    fprintf(stderr, "rcbuf set to %s\n", rcbuf);
  929. -#endif /* DEBUG */
  930. -
  931. -    /*
  932. -     * Fast check for common case: 1-###
  933. -     */
  934. -    if (fastcheck) {
  935. -        p = rcbuf;
  936. -        while (*p != ' ')
  937. -            p++;
  938. -        while (*p == ' ')
  939. -            p++;
  940. -        if (*p++ == '1' && *p++ == '-') {
  941. -            cur = 0;
  942. -            while (isdigit(*p))
  943. -                cur = 10 * cur + *p++ - '0';
  944. -            if (*p == ',' && cur == ngsize) {
  945. -#ifdef DEBUG
  946. -                fprintf(stderr, "Group: %s, all read\n", groupdir);
  947. -#endif
  948. -                groupdir[0] = 0;
  949. -                return 1;
  950. -            }
  951. -            if (cur > ngsize) {
  952. -                /*
  953. -                 * Claim to have read articles
  954. -                 * which "active" believes have
  955. -                 * never existed - we believe "active"
  956. -                 */
  957. -                fprintf(stderr,
  958. -                    "%s %s...\r\n\t%s %ld to %ld\r\n",
  959. -                    "Warning: newsgroup", groupdir,
  960. -                    "last article claimed read reset from",
  961. -                    cur, ngsize);
  962. -            }
  963. -        }
  964. -    }
  965. -
  966. -/*
  967. - * The key to understanding this piece of code is that a bit is set iff
  968. - * that article has NOT been read.  Thus, we fill in the holes when
  969. - * commas are found (e.g. 1-20,30-35 will result in filling in the 21-29
  970. - * holes), and so we assume the newsrc file is properly ordered, the way
  971. - * we write it out.
  972. - */
  973. -    if ((ngsize-minartno) > BITMAPSIZE) {
  974. -        /* This should never happen */
  975. -        (void) xerror("Bitmap not large enough for newsgroup %s", groupdir);
  976. -    }
  977. -
  978. -    cur = 0;
  979. -    bzero(bitmap, (int) (ngsize-minartno)/8+1); /* 8 bits per character */
  980. -
  981. -    /* Decode the .newsrc line indicating what we have read. */
  982. -    for (ptr = rcbuf; *ptr && *ptr != ':'; ptr++)
  983. -        ;
  984. -    while (*ptr) {
  985. -        while (!isdigit(*ptr) && *ptr)
  986. -            ptr++;
  987. -        if (!*ptr)
  988. -            break;
  989. -        (void) sscanf(ptr, "%ld", &next);
  990. -        if (punct == ',') {
  991. -            while (++cur < next) {
  992. -                set(cur);
  993. -            }
  994. -        }
  995. -        cur = next;
  996. -        while (!ispunct(*ptr) && *ptr)
  997. -            ptr++;
  998. -        punct = *ptr;
  999. -    }
  1000. -    if (rflag)
  1001. -        bit = ngsize+1;
  1002. -    else
  1003. -        bit = minartno -1;
  1004. -    nextbit();
  1005. -    ngrp = 1;
  1006. -    return 0;
  1007. -}
  1008. -
  1009. -#ifdef TMAIL
  1010. -catchterm()
  1011. -{
  1012. -    (void) unlink(infile);
  1013. -    (void) unlink(outfile);
  1014. -    xxit(0);
  1015. -}
  1016. -
  1017. -
  1018. -/*
  1019. - * The -M (Mail) interface.  This code is a reasonably simple model for
  1020. - * writing other interfaces.  We write out all relevant articles to
  1021. - * a temp file, then invoke Mail with an option to have it tell us which
  1022. - * articles it read.  Finally we count those articles as really read.
  1023. - */
  1024. -Mail()
  1025. -{
  1026. -    register FILE *fp = NULL, *ofp;
  1027. -    struct hbuf h;
  1028. -    register char    *ptr, *fname;
  1029. -    int    news = 0;
  1030. -    register int i;
  1031. -
  1032. -    for(i=0;i<NUNREC;i++)
  1033. -        h.unrec[i] = NULL;
  1034. -
  1035. -    ofp = xfopen(mktemp(outfile), "w");
  1036. -    if (aflag && *datebuf)
  1037. -        if ((atime = cgtdate(datebuf)) == -1)
  1038. -            xerror("Cannot parse date string");
  1039. -    while (!nextng())
  1040. -        while (bit <= ngsize) {
  1041. -            (void) sprintf(filename, "%s/%ld", dirname(groupdir), bit);
  1042. -            if (access(filename, 4)
  1043. -            || ((fp = art_open (filename, "r")) == NULL)
  1044. -            || (hread(&h, fp, TRUE) == NULL)
  1045. -            || !aselect(&h, FALSE)) {
  1046. -#ifdef DEBUG
  1047. -                fprintf(stderr, "Bad article '%s'\n", filename);
  1048. -#endif
  1049. -                if (fp != NULL) {
  1050. -                    (void) fclose(fp);
  1051. -                    fp = NULL;
  1052. -                }
  1053. -                clear(bit);
  1054. -                nextbit();
  1055. -                continue;
  1056. -            }
  1057. -            fname = ptr = index(h.from, '(');
  1058. -            if (fname) {
  1059. -                while (ptr && ptr[-1] == ' ')
  1060. -                    ptr--;
  1061. -                if (ptr)
  1062. -                    *ptr = 0;
  1063. -                fname++;
  1064. -                ptr = fname + strlen(fname) - 1;
  1065. -                if (*ptr == ')')
  1066. -                    *ptr = 0;
  1067. -            }
  1068. -            h.subtime = cgtdate(h.subdate);
  1069. -            fprintf(ofp, "From %s %s",
  1070. -#ifdef INTERNET
  1071. -                h.from[0] ? h.from :
  1072. -#endif
  1073. -                h.path, ctime(&h.subtime));
  1074. -            if (fname)
  1075. -                fprintf(ofp, "Full-Name: %s\n", fname);
  1076. -            fprintf(ofp, "Newsgroups: %s\n", h.nbuf);
  1077. -            fprintf(ofp, "Subject: %s\n", h.title);
  1078. -            fprintf(ofp, "Article-ID: %s/%ld\n\n", groupdir, bit);
  1079. -            tprint(fp, ofp, TRUE);
  1080. -            putc('\n', ofp);
  1081. -            news = TRUE;
  1082. -            (void) fclose(fp);
  1083. -            fp = NULL;
  1084. -            nextbit();
  1085. -        }
  1086. -    updaterc();
  1087. -    (void) fclose(ofp);
  1088. -    if (!news) {
  1089. -        fprintf(stderr, "No news.\n");
  1090. -        (void) unlink(outfile);
  1091. -        return;
  1092. -    }
  1093. -    (void) signal(SIGHUP, catchterm);
  1094. -    (void) signal(SIGTERM, catchterm);
  1095. -    (void) sprintf(bfr, "%s -f %s -T %s", TMAIL, outfile, mktemp(infile));
  1096. -    fwait(fsubr(ushell, bfr, (char *)NULL));
  1097. -    ofp = xfopen(infile, "r");
  1098. -    (void) fseek(actfp, 0L, 0);
  1099. -    while (fgets(afline, BUFLEN, actfp) != NULL) {
  1100. -        last = 0;
  1101. -        if (sscanf(afline, "%s %ld", bfr, &nngsize) < 2) {
  1102. -            bfr[0] = '\0';
  1103. -            nngsize = 0;
  1104. -        }
  1105. -        if (!ngmatch(bfr, header.nbuf))
  1106. -            continue;
  1107. -        *groupdir = 0;
  1108. -        if (selectng(bfr, TRUE, FALSE))
  1109. -            continue;
  1110. -        (void) fseek(ofp, 0L, 0);
  1111. -        while (fgets(groupdir, BUFLEN, ofp) != NULL) {
  1112. -            (void) nstrip(groupdir);
  1113. -            ptr = index(groupdir, '/');
  1114. -            *ptr = 0;
  1115. -            if (strcmp(bfr, groupdir))
  1116. -                continue;
  1117. -            (void) sscanf(++ptr, "%ld", &last);
  1118. -            clear(last);
  1119. -        }
  1120. -        if (last) {
  1121. -            (void) strcpy(groupdir, bfr);
  1122. -            updaterc();
  1123. -        }
  1124. -    }
  1125. -    (void) unlink(infile);
  1126. -    (void) unlink(outfile);
  1127. -}
  1128. -#endif
  1129. -
  1130. -updaterc()
  1131. -{
  1132. -    register long    cur = 1, next = 1;
  1133. -    register int i;
  1134. -    register char    *ptr;
  1135. -    char    oldptr;
  1136. -
  1137. -    sprintf(rcbuf, "%s%c ", groupdir, zapng ? '!' : ':');
  1138. -
  1139. -    zapng = FALSE;
  1140. -again:
  1141. -    ptr = &rcbuf[strlen(rcbuf)];
  1142. -    while (get(next) && next <= ngsize)
  1143. -        next++;
  1144. -    cur = next;
  1145. -    while (!(get(next)) && next <= ngsize)
  1146. -        next++;
  1147. -    if (cur == next) {
  1148. -        next = ngsize + 1;
  1149. -        goto skip;
  1150. -    }
  1151. -    if (ptr[-1] != ' ')
  1152. -        *ptr++ = ',';
  1153. -    if (cur + 1 == next)
  1154. -        (void) sprintf(ptr, "%ld", cur);
  1155. -    else
  1156. -        (void) sprintf(ptr, "%ld-%ld", cur, next - 1);
  1157. -skip:
  1158. -    if ((long) next > ngsize) {
  1159. -        if (strpbrk(rcbuf, ":!") == NULL)    /* bad line, huh?? */
  1160. -            return;
  1161. -        ptr = index(rcbuf, ' ');
  1162. -        if (ptr == NULL)            /* impossible */
  1163. -            return;
  1164. -        ptr--;
  1165. -        oldptr = *ptr;
  1166. -        ptr[0] = ':';
  1167. -        ptr[1] = '\0';
  1168. -        i = findrcline(groupdir);
  1169. -        if (i >= 0) {
  1170. -            ptr[0] = oldptr;
  1171. -            ptr[1] = ' ';
  1172. -            rcline[i] = realloc(rcline[i], (unsigned)(strlen(rcbuf) + 1));
  1173. -            if (rcline[i] == NULL)
  1174. -                xerror("Cannot realloc");
  1175. -            (void) strcpy(rcline[i], rcbuf);
  1176. -#ifdef DEBUG
  1177. -            fprintf(stderr," new rcline = %s\n", rcline[i]);
  1178. -#endif /* DEBUG */
  1179. -            return;
  1180. -        }
  1181. -        if (++line > LINES)
  1182. -            xerror("Too many newsgroups");
  1183. -        ptr[0] = oldptr;
  1184. -        ptr[1] = ' ';
  1185. -        if ((rcline[line] = malloc((unsigned)(strlen(rcbuf) + 1))) == NULL)
  1186. -            xerror("Not enough memory");
  1187. -        (void) strcpy(rcline[line], rcbuf);
  1188. -#ifdef DEBUG
  1189. -        fprintf(stderr," new rcline2 = %s\n", rcline[line]);
  1190. -#endif /* DEBUG */
  1191. -        return;
  1192. -    }
  1193. -    cur = next;
  1194. -    goto again;
  1195. -}
  1196. -
  1197. -newrc(rcname)
  1198. -char *rcname;
  1199. -{
  1200. -    register FILE *fp;
  1201. -
  1202. -    if (close(creat(rcname, 0666))) {
  1203. -        (void) sprintf(bfr, "Cannot create %s", newsrc);
  1204. -        xerror(bfr);
  1205. -    }
  1206. -
  1207. -    sprintf(bfr, "%s/users", LIB);
  1208. -    if ((fp = fopen(bfr, "a")) != NULL) {
  1209. -        fprintf(fp, "%s\n", username);
  1210. -        (void) fclose(fp);
  1211. -        (void) chmod(bfr, 0666);
  1212. -    }
  1213. -}
  1214. -
  1215. -nextbit()
  1216. -{
  1217. -#ifdef DEBUG
  1218. -    fprintf(stderr,"nextbit() bit = %ld\n", bit);
  1219. -#endif /* DEBUG */
  1220. -    last = bit;
  1221. -    if (readmode == SPEC || xflag) {
  1222. -        if (rflag)
  1223. -            bit--;
  1224. -        else
  1225. -            bit++;
  1226. -        return;
  1227. -    }
  1228. -    if (rflag)
  1229. -        while (--bit, !get(bit) && bit > minartno)
  1230. -            ;
  1231. -    else
  1232. -        while (++bit, !get(bit) && bit <= ngsize)
  1233. -            ;
  1234. -#ifdef DEBUG
  1235. -    fprintf(stderr,"nextng leaves bit as %ld\n", bit);
  1236. -#endif /* DEBUG */
  1237. -}
  1238. -
  1239. -/*
  1240. - * Return TRUE if the user has not ruled out this article.
  1241. - */
  1242. -aselect(hp, insist)
  1243. -register struct hbuf *hp;
  1244. -int    insist;
  1245. -{
  1246. -    if (insist)
  1247. -        return TRUE;
  1248. -    if (tflag && !titmat(hp, header.title))
  1249. -        return FALSE;
  1250. -    if (aflag && cgtdate(hp->subdate) < atime)
  1251. -        return FALSE;
  1252. -    if (index(hp->nbuf, ',') && !rightgroup(hp))
  1253. -        return FALSE;
  1254. -    if (fflag && (hp->followid[0] || prefix(hp->title, "Re:")))
  1255. -        return FALSE;
  1256. -    return TRUE;
  1257. -}
  1258. -
  1259. -/*
  1260. - * Code to avoid showing multiple articles for news.
  1261. - * Works even if you exit news.
  1262. - * Returns nonzero if we should show this article.
  1263. - */
  1264. -rightgroup(hp)
  1265. -struct hbuf *hp;
  1266. -{
  1267. -    char ng[BUFLEN];
  1268. -    register char *p, *g;
  1269. -    int i, flag;
  1270. -
  1271. -    strcpy(ng, hp->nbuf);
  1272. -    g = ng;
  1273. -    flag = 1;
  1274. -    while (g != NULL) {
  1275. -        p = index(g, ',');
  1276. -        if (p != NULL) {
  1277. -            *p++ = '\0';
  1278. -            while (*p == ' ')
  1279. -                p++;
  1280. -        }
  1281. -        if (strcmp(g, groupdir) == 0)
  1282. -            return flag;
  1283. -        if (ngmatch(g, header.nbuf)
  1284. -            && ((i = findrcline(g)) >= 0
  1285. -            && index(rcline[i], '!') == NULL))
  1286. -            flag = 0;
  1287. -        g = p;
  1288. -    }
  1289. -    /* we must be in "junk" or "control" */
  1290. -    return TRUE;
  1291. -}
  1292. -
  1293. -back()
  1294. -{
  1295. -    while (fseek(actfp, -2L, 1) != -1 && ftell(actfp) > 0L) {
  1296. -        if (getc(actfp) == '\n')
  1297. -            return 0;
  1298. -    }
  1299. -    if (ftell(actfp) == 0L)
  1300. -        return 0;
  1301. -    return 1;
  1302. -}
  1303. -
  1304. -/*
  1305. - * Trap interrupts.
  1306. - */
  1307. -onsig(n)
  1308. -int    n;
  1309. -{
  1310. -    (void) signal(n, onsig);
  1311. -    SigTrap = n;
  1312. -    if (rcreadok < 2) {
  1313. -        fprintf(stderr, "Aborted early\n");
  1314. -        xxit(0);
  1315. -    }
  1316. -}
  1317. -
  1318. -/*
  1319. - * finds the line in your .newsrc file (actually the in-core "rcline"
  1320. - * copy of it) and returns the index into the array where it was found.
  1321. - * -1 means it didn't find it.
  1322. - *
  1323. - * We play clever games here to make this faster.  It's inherently
  1324. - * quadratic - we spend lots of CPU time here because we search through
  1325. - * the whole .newsrc for each line.  The "prev" variable remembers where
  1326. - * the last match was found; we start the search there and loop around
  1327. - * to the beginning, in the hopes that the calls will be roughly in order.
  1328. - */
  1329. -int
  1330. -findrcline(name)
  1331. -register char *name;
  1332. -{
  1333. -    register char *    p;
  1334. -    register int    i;
  1335. -    register int    top;
  1336. -    register int    len;
  1337. -    static int    prev;
  1338. -    static int    didthru;
  1339. -
  1340. -    for ( ; didthru <= line; ++didthru)
  1341. -        if ((p = index(rcline[didthru], '!')) != 0 ||
  1342. -            (p = index(rcline[didthru], ':')) != 0) {
  1343. -                lentab[didthru] = (int)(p - rcline[didthru]);
  1344. -        }
  1345. -    len = strlen(name);
  1346. -    top = line;
  1347. -    i = prev;
  1348. -loop:
  1349. -    for ( ; i <= top; ++i)
  1350. -        if (lentab[i] == len && rcline[i] != NULL &&
  1351. -            strncmp(name, rcline[i], len) == 0)
  1352. -            return prev = i;
  1353. -    if (i > line && line > prev - 1) {
  1354. -        i = 0;
  1355. -        top = prev - 1;
  1356. -        goto loop;
  1357. -    }
  1358. -    return -1;
  1359. -}
  1360. -
  1361. -/*
  1362. - * sortactive - make a local copy of the active file, sorted according
  1363. - *   to the user's preferences, according to his .newsrc file.
  1364. - */
  1365. -
  1366. -struct table_elt {
  1367. -    int    rcindex;
  1368. -    long    maxart, minart;
  1369. -    char    yn;
  1370. -};
  1371. -
  1372. -#ifdef SORTACTIVE
  1373. -static int
  1374. -rcsort(a, b)
  1375. -char *a, *b;
  1376. -{
  1377. -    return(((struct table_elt *)a)->rcindex -
  1378. -           ((struct table_elt *)b)->rcindex);
  1379. -}
  1380. -
  1381. -static char *newactivename = "/tmp/newsaXXXXXX";
  1382. -#endif /* SORTACTIVE */
  1383. -
  1384. -sortactive()
  1385. -{
  1386. -    register struct table_elt *tp;
  1387. -    register char *p;
  1388. -    register FILE *nfp, *afp;
  1389. -    char aline[BUFLEN], ngname[BUFLEN];
  1390. -    struct table_elt table[LINES];
  1391. -    int nlines = 0, i, delta, lastline;
  1392. -
  1393. -#ifdef SORTACTIVE
  1394. -    /* make a new sorted copy of ACTIVE */
  1395. -    nfp = fopen(mktemp(newactivename), "w");
  1396. -    (void) chmod(newactivename, 0600);
  1397. -    if (nfp == NULL) {
  1398. -        perror(newactivename);
  1399. -        return;
  1400. -    }
  1401. -
  1402. -    /* look up all the lines in ACTIVE, finding their positions in .newsrc */
  1403. -    p = ACTIVE;
  1404. -    ACTIVE = newactivename;
  1405. -    afp = xfopen(p, "r");
  1406. -    tp = table;
  1407. -#else /* !SORTACTIVE */
  1408. -    afp = xfopen(ACTIVE, "r");
  1409. -#endif /* !SORTACTIVE */
  1410. -    while (fgets(aline, sizeof aline, afp) != NULL) {
  1411. -        if (sscanf(aline,"%s %ld %ld %c", ngname, &tp->maxart,
  1412. -            &tp->minart, &tp->yn) != 4) 
  1413. -            xerror("Active file corrupt");
  1414. -        delta = tp->maxart - tp->minart;
  1415. -        if (delta >= BITMAPSIZE)
  1416. -            BITMAPSIZE = delta + 1;
  1417. -        if (Kflag && tp->maxart > 0 && ngmatch(ngname, header.nbuf)) {
  1418. -            int j;
  1419. -
  1420. -            j = findrcline(ngname);
  1421. -            if (j >= 0 && index(rcline[j], '!') == NULL) {
  1422. -                char rbuf[BUFLEN];
  1423. -                if (tp->maxart == 1)
  1424. -                    sprintf(rbuf, "%s: 1", ngname);
  1425. -                else
  1426. -                    sprintf(rbuf, "%s: 1-%ld", ngname, tp->maxart);
  1427. -                rcline[j] = realloc(rcline[j],
  1428. -                    (unsigned)(strlen(rbuf)+1));
  1429. -                if (rcline[j] == NULL)
  1430. -                    xerror("Not enough memory");
  1431. -                strcpy(rcline[j], rbuf);
  1432. -            }
  1433. -        }
  1434. -#ifdef SORTACTIVE
  1435. -        tp->rcindex = findrcline(ngname);
  1436. -        if (tp->rcindex < 0) {
  1437. -            if (++line > LINES)
  1438. -                xerror("Too many newsgroups");
  1439. -            strcat(ngname, ":");
  1440. -            rcline[line] = malloc((unsigned)(strlen(ngname) + 1));
  1441. -            if (rcline[line] == NULL)
  1442. -                xerror("Not enough memory");
  1443. -            strcpy(rcline[line], ngname);
  1444. -            tp->rcindex = line;
  1445. -        }
  1446. -        tp++;
  1447. -#endif /* SORTACTIVE */
  1448. -    }
  1449. -    (void) fclose(afp);
  1450. -    BITMAPSIZE =  8 * ((BITMAPSIZE+7) / 8);
  1451. -    bitmap = malloc((unsigned)BITMAPSIZE/8);
  1452. -    if (bitmap == NULL)
  1453. -        xerror("Can't malloc bitmap");
  1454. -
  1455. -#ifdef SORTACTIVE
  1456. -    /* sort by position in user's .newsrc file (new groups come up last) */
  1457. -    nlines = tp - table;
  1458. -    qsort((char *)table, nlines, sizeof table[0], rcsort);
  1459. -
  1460. -    tp = table;
  1461. -    lastline = tp->rcindex - 1;
  1462. -    /* copy active to newactive, in the new order */
  1463. -    for (i = 0; i < nlines; i++) {
  1464. -        while (++lastline < tp->rcindex) {
  1465. -            if (strncmp(rcline[lastline], "options ", 8) == 0) {
  1466. -                fprintf(nfp, "%s\n", rcline[lastline]);
  1467. -            } else {
  1468. -                fprintf(stderr, "Duplicate .newsrc line or bad group %s\n",
  1469. -                    rcline[lastline]);
  1470. -                lentab[lastline] = 0;
  1471. -                free(rcline[lastline]);
  1472. -                rcline[lastline] = NULL;
  1473. -            }
  1474. -        }
  1475. -        if (rcline[tp->rcindex] == NULL)
  1476. -            continue;
  1477. -        p = rcline[tp->rcindex];
  1478. -        while (*p != ':' && *p != '!')
  1479. -            fputc(*p++, nfp);
  1480. -        (void) fprintf(nfp, " %ld %ld %c\n", tp->maxart, tp->minart,
  1481. -            tp->yn);
  1482. -        tp++;
  1483. -    }
  1484. -    (void) fclose(nfp);
  1485. -#endif /* SORTACTIVE */
  1486. -}
  1487. *-*-END-of-src/rfuncs.c-*-*
  1488. echo x - src/makeactive.sh 1>&2
  1489. sed 's/.//' >src/makeactive.sh <<'*-*-END-of-src/makeactive.sh-*-*'
  1490. -: "Create active file and newsgroup hierarchy for new machine"
  1491. -: "Usage: sh makeactive.sh LIBDIR SPOOLDIR NEWSUSR NEWSGRP"
  1492. -: '@(#)makeactive    1.22    10/29/86'
  1493. -LIBDIR=$1
  1494. -SPOOLDIR=$2
  1495. -NEWSUSR=$3
  1496. -NEWSGRP=$4
  1497. -cat <<"E_O_F" > /tmp/$$groups
  1498. -general    Articles that should be read by everyone on your local system
  1499. -net.ai            Artificial intelligence discussions.
  1500. -net.announce.arpa-internet    Announcements from the Arpa world
  1501. -net.arch        Computer architecture.
  1502. -net.audio        High fidelity audio.
  1503. -net.auto        Automobiles, automotive products and laws.
  1504. -net.auto.tech        Technical aspects of automobiles, et. al.
  1505. -net.aviation        Aviation rules, means, and methods.
  1506. -net.bicycle        Bicycles, related products and laws.
  1507. -net.books        Books of all genres, shapes, and sizes.
  1508. -net.bugs        General bug reports and fixes.
  1509. -net.bugs.2bsd        Reports of UNIX* version 2BSD related bugs.
  1510. -net.bugs.4bsd        Reports of UNIX version 4BSD related bugs.
  1511. -net.bugs.usg        Reports of USG (System III, V, etc.) bugs.
  1512. -net.bugs.uucp        Reports of UUCP related bugs.
  1513. -net.bugs.v7        Reports of UNIX V7 related bugs.
  1514. -net.cog-eng        Cognitive engineering.
  1515. -net.comics        The funnies, old and new.
  1516. -net.cooks        Food, cooking, cookbooks, and recipes.
  1517. -net.cse            Computer science education.
  1518. -net.cycle        Motorcycles and related products and laws.
  1519. -net.database        Database and data management issues and theory.
  1520. -net.dcom        Data communications hardware and software.
  1521. -net.decus        DEC* Users' Society newsgroup.
  1522. -net.emacs        EMACS editors of different flavors.
  1523. -net.eunice        The SRI Eunice system.
  1524. -net.games        Games and computer games.
  1525. -net.games.board        Discussion and hints on board games.
  1526. -net.games.chess        Chess & computer chess.
  1527. -net.games.emp        Discussion and hints about Empire.
  1528. -net.games.frp        Discussion about Fantasy Role Playing games.
  1529. -net.games.go        Discussion about Go.
  1530. -net.games.hack        Discussion, hints, etc. about the Hack game.
  1531. -net.games.pbm        Discussion about Play by Mail games.
  1532. -net.games.rogue        Discussion and hints about Rogue.
  1533. -net.games.trivia    Discussion about trivia.
  1534. -net.games.video        Discussion about video games.
  1535. -net.garden        Gardening, methods and results.
  1536. -net.graphics        Computer graphics, art, animation, image processing,
  1537. -net.ham-radio        Amateur Radio practices, contests, events, rules, etc.
  1538. -net.ham-radio.packet    Discussion about packet radio setups.
  1539. -net.info-terms        All sorts of terminals.
  1540. -net.internat        Discussion about international standards
  1541. -net.jokes        Jokes and the like.  May be somewhat offensive.
  1542. -net.jokes.d        Discussions on the content of net.jokes articles
  1543. -net.lan            Local area network hardware and software.
  1544. -net.lang        Different computer languages.
  1545. -net.lang.ada        Discussion about Ada*.
  1546. -net.lang.apl        Discussion about APL.
  1547. -net.lang.c        Discussion about C.
  1548. -net.lang.c++        The object-oriented C++ language.
  1549. -net.lang.f77        Discussion about FORTRAN.
  1550. -net.lang.forth        Discussion about Forth.
  1551. -net.lang.lisp        Discussion about LISP.
  1552. -net.lang.mod2        Discussion about Modula-2.
  1553. -net.lang.pascal        Discussion about Pascal.
  1554. -net.lang.prolog        Discussion about PROLOG.
  1555. -net.lang.st80        Discussion about Smalltalk 80.
  1556. -net.lsi            Large scale integrated circuits.
  1557. -net.mag            Magazine summaries, tables of contents, etc.
  1558. -net.mail        Proposed new mail/network standards.
  1559. -net.mail.headers    Gatewayed from the ARPA header-people list.
  1560. -net.micro        Micro computers of all kinds.
  1561. -net.micro.6809        Discussion about 6809's.
  1562. -net.micro.68k        Discussion about 68k's.
  1563. -net.micro.apple        Discussion about Apple micros.
  1564. -net.micro.amiga        Talk about the new Amiga micro.
  1565. -net.micro.atari8    Discussion about 8 bit Atari micros.
  1566. -net.micro.atari16    Discussion about 16 bit Atari micros.
  1567. -net.micro.att        Discussions about AT&T microcomputers 
  1568. -net.micro.cbm        Discussion about Commodore micros.
  1569. -net.micro.cpm        Discussion about the CP/M operating system.
  1570. -net.micro.hp        Discussion about Hewlett/Packard's.
  1571. -net.micro.mac        Material about the Apple Macintosh & Lisa
  1572. -net.micro.ns32k        National Semiconductor 32000 series chips
  1573. -net.micro.pc        Discussion about IBM personal computers.
  1574. -net.micro.ti        Discussion about Texas Instruments.
  1575. -net.micro.trs-80    Discussion about TRS-80's.
  1576. -net.movies        Reviews and discussions of movies.
  1577. -net.music        Music lovers' group.
  1578. -net.music.classical    Discussion about classical music.
  1579. -net.music.folk        Folks discussing folk music of various sorts
  1580. -net.music.gdead        A group for (Grateful) Dead-heads
  1581. -net.music.makers    For performers and their discussions.
  1582. -net.music.synth        Synthesizers and computer music
  1583. -net.news        Discussions of USENET itself.
  1584. -net.news.adm        Comments directed to news administrators.
  1585. -net.news.b        Discussion about B news software.
  1586. -net.news.config        Postings of system down times and interruptions.
  1587. -net.news.group        Discussions and lists of newsgroups
  1588. -net.news.newsite    Postings of new site announcements.
  1589. -net.news.notes        Notesfile software from the Univ. of Illinois.
  1590. -net.news.sa        Comments directed to system administrators.
  1591. -net.news.stargate    Discussion about satellite transmission of news.
  1592. -net.periphs        Peripheral devices.
  1593. -net.pets        Pets, pet care, and household animals in general.
  1594. -net.poems        For the posting of poems.
  1595. -net.puzzle        Puzzles, problems, and quizzes.
  1596. -net.railroad        Real and model train fans' newsgroup.
  1597. -net.rec            Recreational/participant sports.
  1598. -net.rec.birds        Hobbyists interested in bird watching.
  1599. -net.rec.boat        Hobbyists interested in boating.
  1600. -net.rec.bridge        Hobbyists interested in bridge.
  1601. -net.rec.nude        Hobbyists interested in naturist/nudist activities.
  1602. -net.rec.photo        Hobbyists interested in photography.
  1603. -net.rec.scuba        Hobbyists interested in SCUBA diving.
  1604. -net.rec.ski        Hobbyists interested in skiing.
  1605. -net.rec.skydive        Hobbyists interested in skydiving.
  1606. -net.rec.wood        Hobbyists interested in woodworking.
  1607. -net.sf-lovers        Science fiction lovers' newsgroup.
  1608. -net.sources        For the posting of software packages & documentation.
  1609. -net.sources.bugs    For bug fixes and features discussion
  1610. -net.sources.d        For any discussion on net.sources postings.
  1611. -net.sources.games    Postings of recreational software
  1612. -net.sources.mac        Software for the Apple Macintosh
  1613. -net.sport        Spectator sports.
  1614. -net.sport.baseball    Discussion about baseball.
  1615. -net.sport.football    Discussion about football.
  1616. -net.sport.hockey    Discussion about hockey.
  1617. -net.sport.hoops        Discussion about basketball.
  1618. -net.startrek        Star Trek, the TV show and the movies.
  1619. -net.text        Text processing.
  1620. -net.travel        Traveling all over the world.
  1621. -net.tv            The boob tube, its history, and past and current shows.
  1622. -net.tv.drwho        Discussion about Dr. Who.
  1623. -net.tv.soaps        Postings about soap operas.
  1624. -net.unix        UNIX neophytes group.
  1625. -net.unix-wizards    Discussions, bug reports, and fixes on and for UNIX.
  1626. -net.usenix        USENIX Association events and announcements.
  1627. -net.veg            Vegetarians.
  1628. -net.video        Video and video components.
  1629. -net.wines        Wines and spirits.
  1630. -net.wobegon        "A Prairie Home Companion" radio show discussion.
  1631. -mod.announce        General announcements of interest to all. (Moderated)
  1632. -mod.announce.newusers    Explanatory postings for new users. (Moderated)
  1633. -mod.ai            Discussions about Artificial Intelligence (Moderated)
  1634. -mod.amiga        Commodore Amiga micros -- info, uses, but no programs. (Moderated)
  1635. -mod.amiga.binaries    Encoded public domain programs in binary form. (Moderated)
  1636. -mod.amiga.sources    Public domain software in source code format. (Moderated)
  1637. -mod.compilers        Discussion about compiler construction, theory, etc. (Moderated)
  1638. -mod.computers        Discussion about various computers and related. (Moderated)
  1639. -mod.computers.68k        68000-based systems. (Moderated)
  1640. -mod.computers.apollo        Apollo computer systems. (Moderated)
  1641. -mod.computers.masscomp        The Masscomp line of computers. (Moderated)
  1642. -mod.computers.ibm-pc        The IBM PC, PC-XT, and PC-AT. (Moderated)
  1643. -mod.computers.laser-printers    Laser printers, hardware and software. (Moderated)
  1644. -mod.computers.pyramid        Pyramid 90x computers. (Moderated)
  1645. -mod.computers.ridge        Ridge 32 computers and ROS. (Moderated)
  1646. -mod.computers.sequent        Sequent systems, (esp. Balance 8000). (Moderated)
  1647. -mod.computers.sun        Sun "workstation" computers (Moderated)
  1648. -mod.computers.vax        DEC's VAX* line of computers & VMS. (Moderated)
  1649. -mod.computers.workstations    Various workstation-type computers. (Moderated)
  1650. -mod.conferences        Calls for papers and conference announcements. (Moderated)
  1651. -mod.comp-soc        Discussion on the impact of technology on society. (Moderated)
  1652. -mod.graphics        Graphics software, hardware, theory, etc. (Moderated)
  1653. -mod.human-nets        Computer aided communications digest. (Moderated)
  1654. -mod.legal        Discussions of computers and the law. (Moderated)
  1655. -mod.mac            Apple Macintosh micros -- info, uses, but no programs. (Moderated)
  1656. -mod.mac.binaries    Encoded public domain programs in binary form. (Moderated)
  1657. -mod.mac.sources        Public domain software in source code format. (Moderated)
  1658. -mod.mag            Discussions on electronicly published "magazines" (Moderated)
  1659. -mod.mag.otherrealms    Edited science fiction and fantasy "magazine". (Moderated)
  1660. -mod.map            Various maps, including UUCP maps (Moderated)
  1661. -mod.movies        Reviews and discussion of movies (Moderated)
  1662. -mod.music        Reviews and discussion of things musical (Moderated)
  1663. -mod.music.gaffa        Progressive music discussions (e.g., Kate Bush). (Moderated)
  1664. -mod.newprod        Announcements of new products of interest to readers (Moderated)
  1665. -mod.newslists        Postings of news-related statistics and lists (Moderated)
  1666. -mod.os            Disussions about operating systems and related areas. (Moderated)
  1667. -mod.os.os9        Discussions about the os9 operating system. (Moderated)
  1668. -mod.os.unix        Discussion of UNIX* features and bugs. (Moderated)
  1669. -mod.philosophy        Discussion of philosphical issues and concepts. (Moderated)
  1670. -mod.philosophy.tech    Technical philosophy: math, science, logic, etc (Moderated)
  1671. -mod.politics        Discussions on political problems, systems, solutions. (Moderated)
  1672. -mod.politics.arms-d        Arms discussion digest. (Moderated)
  1673. -mod.protocols        Various forms and types of FTP protocol discussions. (Moderated)
  1674. -mod.protocols.appletalk        Applebus hardware & software discussion. (Moderated)
  1675. -mod.protocols.kermit        Information about the Kermit package. (Moderated)
  1676. -mod.protocols.tcp-ip        TCP and IP network protocols. (Moderated)
  1677. -mod.psi            Discussion of paranormal abilities and experiences. (Moderated)
  1678. -mod.rec            Discussions on pastimes (not currently active) (Moderated)
  1679. -mod.rec.guns        Discussions about firearms (Moderated)
  1680. -mod.recipes        A "distributed cookbook" of screened recipes. (Moderated)
  1681. -mod.religion        Top-level group with no moderator (as of yet). (Moderated)
  1682. -mod.religion.christian    Discussions on Christianity and related topics. (Moderated)
  1683. -mod.risks        Risks to the public from computers & users. (Moderated)
  1684. -mod.sources        postings of public-domain sources. (Moderated)
  1685. -mod.sources.doc        Archived public-domain documentation. (Moderated)
  1686. -mod.sources.games    Postings of public-domain game sources (Moderated)
  1687. -mod.std            Discussion about various standards (Moderated)
  1688. -mod.std.c        Discussion about C language standards (Moderated)
  1689. -mod.std.mumps        Discussion for the X11.1 committee on Mumps (Moderated)
  1690. -mod.std.unix        Discussion for the P1003 committee on UNIX (Moderated)
  1691. -mod.techreports        Announcements and lists of technical reports. (Moderated)
  1692. -mod.telecom        Telecommunications digest. (Moderated)
  1693. -mod.test        Testing of moderated newsgroups -- no moderator (Moderated)
  1694. -mod.vlsi        Very large scale integrated circuits. (Moderated)
  1695. -misc.consumers        Consumer interests, product reviews, etc.
  1696. -misc.consumers.house    Discussion about owning and maintaining a house.
  1697. -misc.forsale        Items for sale.
  1698. -misc.headlines        Current interest: drug testing, terrorism, etc.
  1699. -misc.invest        Investments and the handling of money.
  1700. -misc.jobs        Job announcements, requests, etc.
  1701. -misc.kids        Children, their behavior and activities.
  1702. -misc.legal        Legalities and the ethics of law.
  1703. -misc.misc        Various discussions not fitting in any other group.
  1704. -misc.taxes        Tax laws and advice.
  1705. -misc.test        For testing of network software.  Very boring.
  1706. -misc.wanted        Requests for things that are needed (NOT software).
  1707. -sci.astro        Astronomy discussions and information.
  1708. -sci.bio            Biology and related sciences.
  1709. -sci.crypt        Different methods of data en/decryption.
  1710. -sci.electronics        Circuits, theory, electrons and discussions.
  1711. -sci.lang        Natural languages, communication, etc.
  1712. -sci.math        Mathematical discussions and pursuits
  1713. -sci.math.stat        Statistics discussion.
  1714. -sci.math.symbolic    Symbolic algebra discussion.
  1715. -sci.med            Medicine and its related products and regulations.
  1716. -sci.misc        Short-lived discussions on subjects in the sciences.
  1717. -sci.physics        Physical laws, properties, etc.
  1718. -sci.research        Research methods, funding, ethics, and whatever.
  1719. -sci.space        Space, space programs, space related research, etc.
  1720. -sci.space.shuttle    The space shuttle and the STS program.
  1721. -soc.college        College, college activities, campus life, etc.
  1722. -soc.culture.african    Discussions about Africa & things African
  1723. -soc.culture.celtic    Group about Celtics (*not* basketball!)
  1724. -soc.culture.greek    Group about Greeks.
  1725. -soc.culture.indian    Group for discussion about India & things Indian
  1726. -soc.culture.jewish    Group for discussion about Jewish culture
  1727. -soc.culture.misc    Group for discussion about other cultures
  1728. -soc.misc        Socially-oriented topics not in other groups.
  1729. -soc.motss        Issues pertaining to homosexuality.
  1730. -soc.roots        Genealogical matters.
  1731. -soc.singles        Newsgroup for single people, their activities, etc.
  1732. -soc.net-people        Announcements, requests, etc. about people on the net.
  1733. -soc.women        Women's rights, discrimination, etc.
  1734. -talk.abortion        All sorts of discussions and arguments on abortion.
  1735. -talk.bizarre        The unusual, bizarre, curious, and often stupid.
  1736. -talk.origins        Evolution versus creationism (sometimes hot!).
  1737. -talk.philosophy.misc    Philosophical musings on all topics.
  1738. -talk.politics.misc    Political discussions and ravings of all kinds.
  1739. -talk.politics.theory    Theory of politics and political systems.
  1740. -talk.religion.misc    Religious, ethical, & moral implications.
  1741. -talk.rumors        For the posting of rumors.
  1742. -E_O_F
  1743. -: if active file is empty, create it
  1744. -if test ! -s $LIBDIR/active
  1745. -then
  1746. -    sed 's/[     ].*/ 00000 00001/' /tmp/$$groups > $LIBDIR/active
  1747. -    cat <<'E_O_F' >>$LIBDIR/active
  1748. -control 00000 00001
  1749. -junk 00000 00001
  1750. -E_O_F
  1751. -    set - group 0 1
  1752. -else
  1753. -: make sure it is in the new format
  1754. -    set - `sed 1q $LIBDIR/active`
  1755. -    case $# in
  1756. -    4)    ed - $LIBDIR/active << 'EOF'
  1757. -g/^mod\./s/y$/m/
  1758. -w
  1759. -q
  1760. -EOF
  1761. -        ;;
  1762. -    3)    ;;
  1763. -    2)    ed - $LIBDIR/active << 'EOF'
  1764. -1,$s/$/ 00001/
  1765. -w
  1766. -q
  1767. -EOF
  1768. -        echo
  1769. -        echo Active file updated to new format.
  1770. -        echo You must run expire immediately after this install
  1771. -        echo is done to properly update the tables.;;
  1772. -    *) echo Active file is in unrecognized format. Not upgraded.;;
  1773. -    esac
  1774. -fi
  1775. -if test $# -eq 3 -o $# -eq 2
  1776. -then
  1777. -    (sed '/^!net/!d
  1778. -s/^!//
  1779. -s!^!/!
  1780. -s!$! /s/$/ n/!
  1781. -' $LIBDIR/ngfile
  1782. -    echo '/ n$/!s/$/ y/') >/tmp/$$sed
  1783. -    mv $LIBDIR/active $LIBDIR/oactive
  1784. -    sed -f /tmp/$$sed $LIBDIR/oactive >$LIBDIR/active
  1785. -    chown $NEWSUSR $LIBDIR/active
  1786. -    chgrp $NEWSGRP $LIBDIR/active
  1787. -    chmod 644 $LIBDIR/active
  1788. -fi
  1789. -sort /tmp/$$groups | $LIBDIR/checkgroups | tee /tmp/checkgroups.out
  1790. -echo the output of checkgroups has been copied into /tmp/checkgroups.out
  1791. -rm -f /tmp/$$*
  1792. *-*-END-of-src/makeactive.sh-*-*
  1793. echo x - src/rfuncs2.c 1>&2
  1794. sed 's/.//' >src/rfuncs2.c <<'*-*-END-of-src/rfuncs2.c-*-*'
  1795. -/*
  1796. - * This software is Copyright 1986 by Rick Adams.
  1797. - *
  1798. - * Permission is hereby granted to copy, reproduce, redistribute or
  1799. - * otherwise use this software as long as: there is no monetary
  1800. - * profit gained specifically from the use or reproduction or this
  1801. - * software, it is not sold, rented, traded or otherwise marketed, and
  1802. - * this copyright notice is included prominently in any copy
  1803. - * made.
  1804. - *
  1805. - * The author make no claims as to the fitness or correctness of
  1806. - * this software for any use whatsoever, and it is provided as is. 
  1807. - * Any use of this software is at the user's own risk.
  1808. - *
  1809. - * rfuncs2 - more routines needed by readr.
  1810. - */
  1811. -
  1812. -#ifdef SCCSID
  1813. -static char    *SccsId = "@(#)rfuncs2.c    1.32    10/23/86";
  1814. -#endif /* SCCSID */
  1815. -
  1816. -/*LINTLIBRARY*/
  1817. -
  1818. -#include "rparams.h"
  1819. -
  1820. -static char    lbuf[LBUFLEN];
  1821. -
  1822. -FILE *popen();
  1823. -
  1824. -/*
  1825. - * Match title.
  1826. - */
  1827. -titmat(h, titlist)
  1828. -register struct hbuf *h;
  1829. -register char    *titlist;
  1830. -{
  1831. -    register char    *p;
  1832. -
  1833. -    while (*titlist != '\0') {
  1834. -
  1835. -        if (strcmp(titlist, h->ident) == 0)
  1836. -            return TRUE;
  1837. -        for (p = h->title; *p != '\0'; p++)
  1838. -            if (prefix(p, titlist)) {
  1839. -                return TRUE;
  1840. -            }
  1841. -        while (*titlist++ != '\0')
  1842. -            ;
  1843. -    }
  1844. -    return FALSE;
  1845. -}
  1846. -
  1847. -
  1848. -/*
  1849. - * Save the news item in the user's file.
  1850. - *    Allow files with first character as '|' to write article
  1851. - *    to program across a pipe.
  1852. - */
  1853. -
  1854. -#define PIPECHAR '|'
  1855. -
  1856. -save(file, to)
  1857. -register char    *file, *to;
  1858. -{
  1859. -    register FILE *ufp, *hfp;
  1860. -#ifdef u370
  1861. -    static struct hbuf hh;
  1862. -#else /* !u370 */
  1863. -    struct hbuf hh;
  1864. -#endif /* !u370 */
  1865. -    int    isprogram = 0;
  1866. -    int    isnew = 1;
  1867. -    register int i;
  1868. -
  1869. -    for(i=0;i<NUNREC;i++)
  1870. -        hh.unrec[i] = NULL;
  1871. -
  1872. -    if ((hfp = art_open(file, "r")) == NULL) {
  1873. -        fprintf(stderr, "Can't get article.\n");
  1874. -        return;
  1875. -    }
  1876. -    if (hread(&hh, hfp, TRUE) == NULL) {
  1877. -        fprintf(stderr, "Article is garbled.\n");
  1878. -        return;
  1879. -    }
  1880. -    ufp = fopen(to, "r");
  1881. -    if (ufp != NULL) {
  1882. -        (void) fclose(ufp);
  1883. -        isnew = 0;
  1884. -    }
  1885. -    (void) setgid(gid);
  1886. -    (void) setuid(uid);
  1887. -    (void) umask(savmask);
  1888. -
  1889. -    if (*to == PIPECHAR) {
  1890. -        if ((ufp = popen (&to[1], "w")) == NULL) {
  1891. -            fprintf(stderr,"Cannot execute %s\n", &to[1]);
  1892. -            return;
  1893. -        }
  1894. -        isprogram++;
  1895. -    } else if ((ufp = fopen(to, "a")) == NULL) {
  1896. -        fprintf(stderr,"Cannot append to %s.\n", to);
  1897. -        return;
  1898. -    }
  1899. -    /*
  1900. -     * V7MAIL code is here to conform to V7 mail format.
  1901. -     * If you need a different format to be able to
  1902. -     * use your local mail command (such as four ^A's
  1903. -     * on the end of articles) substitute it here.
  1904. -     */
  1905. -#ifdef MMDF
  1906. -    if (!isprogram)
  1907. -        fprintf(ufp, "\001\001\001\001\n");  /* MMDF message header */
  1908. -#endif /* MMDF */
  1909. -#ifdef V7MAIL
  1910. -    hh.subtime = cgtdate(hh.subdate);
  1911. -    fprintf(ufp, "From %s %s", replyname(&hh), ctime(&hh.subtime));
  1912. -#endif
  1913. -    hprint(&hh, ufp, 2);
  1914. -#ifdef V7MAIL
  1915. -    tprint(hfp, ufp, TRUE);
  1916. -    putc('\n', ufp);    /* force blank line at end (ugh) */
  1917. -#else
  1918. -    tprint(hfp, ufp, FALSE);
  1919. -#endif
  1920. -    (void) fclose(hfp);
  1921. -#ifdef MMDF
  1922. -    if (!isprogram)
  1923. -        fprintf(ufp, "\001\001\001\001\n");  /* MMDF message header */
  1924. -#endif /* MMDF */
  1925. -    if (isprogram)
  1926. -        (void) pclose (ufp);
  1927. -    else
  1928. -        (void) fclose(ufp);
  1929. -    if (!isprogram)
  1930. -        printf("%s: %s\n", to, isnew ? "New file" : "Appended");
  1931. -}
  1932. -
  1933. -
  1934. -/*
  1935. - * Print out the rest of the article.
  1936. - */
  1937. -tprint(ifp, ofp, checkfrom)
  1938. -register FILE *ifp, *ofp;
  1939. -int checkfrom;
  1940. -{
  1941. -    while ((fgets(bfr, sizeof bfr, ifp)) != NULL && !SigTrap) {
  1942. -        if (checkfrom && strncmp(bfr, "From ", 5) == 0)
  1943. -            putc('>', ofp);
  1944. -        (void) fputs(bfr, ofp);
  1945. -    }
  1946. -    if (SigTrap)
  1947. -        qfflush(ofp);
  1948. -    (void) fflush(ofp);
  1949. -    fprintf(ofp, (SigTrap ? "\n\n" : "\n"));
  1950. -    SigTrap = FALSE;
  1951. -}
  1952. -
  1953. -
  1954. -/*
  1955. - * Print the file header.
  1956. - */
  1957. -hprint(hp, ofp, verbose)
  1958. -register struct hbuf *hp;
  1959. -int    verbose;
  1960. -register FILE *ofp;
  1961. -{
  1962. -    register char    *p1, *p2;
  1963. -    char    fname[BUFLEN];
  1964. -    char *tailpath();
  1965. -
  1966. -    fname[0] = '\0';        /* init name holder */
  1967. -
  1968. -    if (verbose == 2) {
  1969. -        lhwrite(hp, ofp);
  1970. -        return;
  1971. -    }
  1972. -
  1973. -    if (lflag || eflag) {
  1974. -        char buf1[80], buf2[200];
  1975. -        char *cp;
  1976. -
  1977. -        (void) strcpy(bfr, groupdir);
  1978. -        for (cp=bfr; *cp; cp++)
  1979. -            if (*cp == '/')
  1980. -                *cp = '.';
  1981. -        (void) sprintf(buf1, "%s/%ld", bfr, bit);
  1982. -        (void) sprintf(buf2, "%-20s %s", buf1, hp->title);
  1983. -        fprintf(ofp, "%.76s\n", buf2);
  1984. -        return;
  1985. -    }
  1986. -
  1987. -    p1 = index(hp->from, '(');    /* Find the sender's full name. */
  1988. -    if (p1 == NULL && hp->path[0])
  1989. -        p1 = index(hp->path, '(');
  1990. -    if (p1 != NULL) {
  1991. -        strcpy(fname, p1+1);
  1992. -        p2 = index(fname, ')');
  1993. -        if (p2 != NULL)
  1994. -            *p2 = '\0';
  1995. -    }
  1996. -
  1997. -    fprintf(ofp, "Subject: %s\n", hp->title);
  1998. -    if (!hflag && hp->summary[0])
  1999. -        fprintf(ofp, "Summary: %s\n", hp->summary);
  2000. -    if (!hflag && hp->keywords[0])
  2001. -        fprintf(ofp, "Keywords: %s\n", hp->keywords);
  2002. -    if (verbose) {
  2003. -        fprintf(ofp, "From: %s\n", hp->from);
  2004. -        fprintf(ofp, "Path: %s\n", hp->path);
  2005. -        if (hp->organization[0])
  2006. -            fprintf(ofp, "Organization: %s\n", hp->organization);
  2007. -    }
  2008. -    else {
  2009. -        if (p1 != NULL)
  2010. -            *--p1 = '\0';        /* bump over the '(' */
  2011. -#ifdef INTERNET
  2012. -        /*
  2013. -         * Prefer Path line if it's in internet format, or if we don't
  2014. -         * understand internet format here, or if there is no reply-to.
  2015. -         */
  2016. -        fprintf(ofp, "From: %s", hp->from);
  2017. -#else
  2018. -        fprintf(ofp, "Path: %s", tailpath(hp));
  2019. -#endif
  2020. -        if (fname[0] || hp->organization[0]) {
  2021. -            if (fname[0] == '\0') {
  2022. -                (void) strcpy(fname,hp->from);
  2023. -                p2 = index(fname,'@');
  2024. -                if (p2)
  2025. -                    *p2 = '\0';
  2026. -            }
  2027. -            fprintf(ofp, " (%s", fname);
  2028. -            if (hp->organization[0] && !hflag)
  2029. -                fprintf(ofp, " @ %s", hp->organization);
  2030. -            fprintf(ofp, ")");
  2031. -        }
  2032. -        fprintf(ofp, "\n");
  2033. -        if (p1 != NULL)
  2034. -            *p1 = ' ';
  2035. -    }
  2036. -
  2037. -    if (verbose) {
  2038. -        fprintf(ofp, "Newsgroups: %s\n", hp->nbuf);
  2039. -        fprintf(ofp, "Date: %s\n", hp->subdate);
  2040. -        if (hp->sender[0])
  2041. -            fprintf(ofp, "Sender: %s\n", hp->sender);
  2042. -        if (hp->replyto[0])
  2043. -            fprintf(ofp, "Reply-To: %s\n", hp->replyto);
  2044. -        if (hp->followto[0])
  2045. -            fprintf(ofp, "Followup-To: %s\n", hp->followto);
  2046. -    }
  2047. -    else if (index(hp->nbuf, ',') || strcmp(groupdir, "junk") == 0)
  2048. -        fprintf(ofp, "Newsgroups: %s\n", hp->nbuf);
  2049. -
  2050. -    if (pflag || ofp != stdout)
  2051. -        putc('\n', ofp);
  2052. -}
  2053. -
  2054. -
  2055. -/*
  2056. - * If ofp != stdout, close it and run the script in coptbuf.
  2057. - */
  2058. -cout(ofp)
  2059. -FILE *ofp;
  2060. -{
  2061. -    register char    *p, *q, *r;
  2062. -
  2063. -    if (ofp == stdout || ofp == NULL)
  2064. -        return;
  2065. -    (void) fclose(ofp);
  2066. -    p = coptbuf;
  2067. -    q = lbuf;
  2068. -    while ((*q = *p++) != '\0')
  2069. -        if (*q++ == FMETA) {
  2070. -            q--;
  2071. -            r = outfile;
  2072. -            while ((*q++ = *r++) != '\0')
  2073. -                ;
  2074. -            q--;
  2075. -        }
  2076. -    fwait(fsubr(ushell, lbuf, (char *)NULL));
  2077. -    (void) unlink(outfile);
  2078. -}
  2079. -
  2080. -
  2081. -cdump(ofp)
  2082. -register FILE *ofp;
  2083. -{
  2084. -    if (ofp == stdout)
  2085. -        return;
  2086. -    fclose(ofp);
  2087. -    unlink(outfile);
  2088. -}
  2089. -
  2090. -
  2091. -/*
  2092. - * Quiet 'flush'.
  2093. - * Empty (without fflush()) the buffer for stream fp.
  2094. - */
  2095. -/* ARGSUSED */
  2096. -qfflush(fp)
  2097. -FILE *fp;
  2098. -{
  2099. -    /* Alas, stdio does not permit this */
  2100. -}
  2101. -
  2102. -
  2103. -/*
  2104. - * Count the number of remaining lines in file fp.
  2105. - * Do not move the file pointer.
  2106. - */
  2107. -linecnt(fp)
  2108. -FILE *fp;
  2109. -{
  2110. -    long    curpos;
  2111. -    register int    nlines = 0;
  2112. -    register int    c;
  2113. -
  2114. -    if (fp == NULL)
  2115. -        return 0;
  2116. -    curpos = ftell(fp);
  2117. -    while ((c = getc(fp)) != EOF)
  2118. -        if (c == '\n')
  2119. -            nlines++;
  2120. -    (void) fseek(fp, curpos, 0);
  2121. -    return nlines;
  2122. -}
  2123. -
  2124. -
  2125. -/*
  2126. - * Transmit file to system.
  2127. - */
  2128. -transmit(sp, file)
  2129. -register struct srec *sp;
  2130. -char    *file;
  2131. -{
  2132. -    register FILE *ifp, *ofp;
  2133. -    register int    c, i;
  2134. -#ifdef u370
  2135. -    static struct hbuf hh;
  2136. -#else /* !u370 */
  2137. -    struct hbuf hh;
  2138. -#endif /* !u370 */
  2139. -    char    TRANS[BUFLEN];
  2140. -
  2141. -#ifdef DEBUG
  2142. -    fprintf(stderr, "xmit %s to %s using %s\n", file, sp->s_name, sp->s_xmit);
  2143. -#endif
  2144. -    bzero((char *)&hh, sizeof hh);
  2145. -    ifp = xart_open(file, "r");
  2146. -    if (hread(&hh, ifp, TRUE) == NULL)
  2147. -        return;
  2148. -    strcpy(TRANS, "/tmp/trXXXXXX");
  2149. -    ofp = xfopen(mktemp(TRANS), "w");
  2150. -    if (index(sp->s_flags, 'A') == NULL)
  2151. -        hwrite(&hh, ofp);
  2152. -    else {
  2153. -#ifdef OLD
  2154. -            fprintf(ofp, "A%s\n%s\n%s!%s\n%s\n%s\n", oident(hh.ident), hh.nbuf, FULLSYSNAME,
  2155. -                hh.path, hh.subdate, hh.title);
  2156. -#else /* !OLD */
  2157. -            logerr("Must have OLD defined to use A flag for xmit");
  2158. -            unlink(TRANS);
  2159. -            return;
  2160. -#endif /* !OLD */
  2161. -    }
  2162. -    while ((c = getc(ifp)) != EOF)
  2163. -        putc(c, ofp);
  2164. -    (void) fclose(ifp);
  2165. -    (void) fclose(ofp);
  2166. -    for (i=0;i<NUNREC;i++)
  2167. -        if (hh.unrec[i] != NULL)
  2168. -            free(hh.unrec[i]);
  2169. -    if (*sp->s_xmit == '\0' || strpbrk(sp->s_flags, "FUMH"))
  2170. -        (void) sprintf(bfr, DFTXMIT, sp->s_name, TRANS);
  2171. -    else
  2172. -        (void) sprintf(bfr, "(%s) < %s", sp->s_xmit, TRANS);
  2173. -#ifdef DEBUG
  2174. -    fprintf(stderr, "%s\n", bfr);
  2175. -#endif
  2176. -    (void) system(bfr);
  2177. -    (void) unlink(TRANS);
  2178. -}
  2179. -
  2180. -
  2181. -/*
  2182. - * Cancel the article whose header is in hp, by posting a control message
  2183. - * to cancel it.  The scope of the control message depends on who would
  2184. - * really be willing to cancel it.  It is sent as far as it will do any good.
  2185. - * notauthor is true iff the person posting this article is not the
  2186. - * real author of the article being cancelled.
  2187. - */
  2188. -cancel(ofp, hp, notauthor)
  2189. -FILE *ofp;
  2190. -struct hbuf *hp;
  2191. -int    notauthor;
  2192. -{
  2193. -    int    pid;
  2194. -
  2195. -    fflush(ofp);
  2196. -    pid = vfork();
  2197. -    if (pid < 0) {
  2198. -        perror("readnews: cancel");
  2199. -        return 0;
  2200. -    }
  2201. -    if (pid > 0)
  2202. -        return 0;
  2203. -    if (notauthor)
  2204. -        (void) sprintf(bfr, "%s/%s -c 'cancel %s' -n %s -d local < /dev/null",
  2205. -            LIB, "inews", hp->ident, hp->nbuf);
  2206. -    else {
  2207. -        if (hp->distribution[0] == '\0')
  2208. -            (void) sprintf(bfr, "%s/%s -c 'cancel %s' -n %s < /dev/null",
  2209. -                LIB, "inews", hp->ident, hp->nbuf);
  2210. -        else
  2211. -            (void) sprintf(bfr, "%s/%s -c 'cancel %s' -n %s -d %s < /dev/null",
  2212. -                LIB, "inews", hp->ident, hp->nbuf, hp->distribution);
  2213. -    }
  2214. -    execl("/bin/sh", "sh", "-c", bfr, (char *) 0);
  2215. -    perror(bfr);
  2216. -    for ( ; ; )
  2217. -        exit(1);
  2218. -}
  2219. -
  2220. -
  2221. -dash(num, ofp)
  2222. -register int    num;
  2223. -register FILE *ofp;
  2224. -{
  2225. -    register int    i;
  2226. -
  2227. -    for (i = 0; i < num; i++)
  2228. -        putc('-', ofp);
  2229. -    putc('\n', ofp);
  2230. -}
  2231. -
  2232. -
  2233. -help(ofp)
  2234. -register FILE *ofp;
  2235. -{
  2236. -    register FILE *fp;
  2237. -    register int    c;
  2238. -    char temp[BUFLEN];
  2239. -
  2240. -    if (cflag) {
  2241. -oneline:
  2242. -        fprintf(ofp, "(n)ext re(p)rint (w)rite (q)uit (r)eply\
  2243. - (c)ancel -[n] +[n] (f)ollowup (N)ext (U)nsubscribe (v)ersion\n");
  2244. -        return;
  2245. -    }
  2246. -    (void) sprintf(temp, "%s/%s", LIB, "help");
  2247. -    if ((fp = fopen(temp, "r")) == NULL) {
  2248. -        fprintf(ofp, "No help file.\n");
  2249. -        goto oneline;
  2250. -    }
  2251. -    while ((c = getc(fp)) != EOF && !SigTrap)
  2252. -        putc(c, ofp);
  2253. -    (void) fclose(fp);
  2254. -}
  2255. -
  2256. -
  2257. -pout(ofp)
  2258. -FILE *ofp;
  2259. -{
  2260. -    register char    *p, *q, *r;
  2261. -
  2262. -    p = PAGER;
  2263. -    q = lbuf;
  2264. -    while ((*q = *p++) != '\0')
  2265. -        if (*q++ == FMETA) {
  2266. -            q--;
  2267. -            r = filename;
  2268. -            while ((*q++ = *r++) != '\0')
  2269. -                ;
  2270. -            q--;
  2271. -        }
  2272. -    fwait(fsubr(ushell, lbuf, (char *)NULL));
  2273. -    fprintf(ofp, "\n");
  2274. -}
  2275. -
  2276. -/*
  2277. - * Print a very brief version of the date in question.
  2278. - */
  2279. -char *
  2280. -briefdate(datestr)
  2281. -char *datestr;
  2282. -{
  2283. -    time_t dt, now;
  2284. -    char *tmstr;
  2285. -    char *wkday, *monthdate, *timeofday;
  2286. -    static char rbuf[20];
  2287. -
  2288. -    dt = cgtdate(datestr);
  2289. -    tmstr = ctime(&dt);
  2290. -
  2291. -    wkday = tmstr; tmstr[3] = '\0';
  2292. -    monthdate = tmstr+4; tmstr[10] = '\0';
  2293. -    timeofday = tmstr+11; tmstr[16] = '\0';
  2294. -
  2295. -    (void) time(&now);
  2296. -    if (now - dt < WEEKS)
  2297. -        (void) strcpy(rbuf, wkday);
  2298. -    else
  2299. -        (void) strcpy(rbuf, monthdate);
  2300. -    (void) strcat(rbuf, " ");
  2301. -    (void) strcat(rbuf, timeofday);
  2302. -    return rbuf;
  2303. -}
  2304. -
  2305. -/*
  2306. - * Return TRUE iff stdout is /dev/null.
  2307. - */
  2308. -ignoring()
  2309. -{
  2310. -    struct stat ss, ns;
  2311. -
  2312. -    if (fstat(1, &ss) < 0)
  2313. -        return FALSE;
  2314. -    if (stat("/dev/null", &ns) < 0)
  2315. -        return FALSE;
  2316. -    if (ss.st_dev == ns.st_dev && ss.st_rdev == ns.st_rdev)
  2317. -        return TRUE;
  2318. -    return FALSE;
  2319. -}
  2320. *-*-END-of-src/rfuncs2.c-*-*
  2321. echo x - src/iextern.c 1>&2
  2322. sed 's/.//' >src/iextern.c <<'*-*-END-of-src/iextern.c-*-*'
  2323. -/*
  2324. - * iextern - external definitions for inews.
  2325. - */
  2326. -
  2327. -#ifdef SCCSID
  2328. -static char    *SccsId = "@(#)iextern.c    2.17    9/19/86";
  2329. -#endif /* SCCSID */
  2330. -
  2331. -#include "iparams.h"
  2332. -
  2333. -int    uid, gid;            /* real user/group I.D. */
  2334. -int    duid, dgid;            /* effective user/group I.D. */
  2335. -int    SigTrap;            /* set if signal trapped */
  2336. -int    savmask;            /* old umask */
  2337. -int    mode;                /* mode of news program */
  2338. -struct hbuf header;            /* general-use header structure */
  2339. -char    bfr[LBUFLEN];            /* general-use scratch area */
  2340. -char    nbuf[LBUFLEN];            /* local newsgroup buffer */
  2341. -char    filename[BUFLEN];        /* general-use file name */
  2342. -char    not_here[SBUFLEN];        /* name of system not to xmit to */
  2343. -
  2344. -#ifndef ROOTID
  2345. -int    ROOTID;                /* special users id # */
  2346. -#endif
  2347. -
  2348. -char    *DFLTNG = "general";        /* default newsgroup */
  2349. -FILE    *infp;                /* input file-pointer */
  2350. -FILE    *actfp;                /* active newsgroups file pointer */
  2351. -int    tty;                /* set if infp is a tty */
  2352. -char    *PARTIAL = "dead.article";    /* place to save partial news */
  2353. -char    *SHELL = "/bin/sh";        /* shell for inews to use    */
  2354. -int    is_ctl;                /* true for a control message */
  2355. -char    is_mod[NAMELEN];        /* contains newsgroup if moderated */
  2356. *-*-END-of-src/iextern.c-*-*
  2357. exit
  2358.